package br.com.toscano.gobra.view;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.inject.Inject;

import br.com.toscano.gobra.business.DespesaBC;
import br.com.toscano.gobra.business.ProjetoAtividadeBC;
import br.com.toscano.gobra.domain.Despesa;
import br.com.toscano.gobra.domain.ProjetoAtividade;
import br.gov.frameworkdemoiselle.annotation.PreviousView;
import br.gov.frameworkdemoiselle.stereotype.ViewController;
import br.gov.frameworkdemoiselle.template.AbstractEditPageBean;
import br.gov.frameworkdemoiselle.transaction.Transactional;

@ViewController
@PreviousView("./despesa_list.jsf")
public class DespesaEditMB extends AbstractEditPageBean<Despesa, Long> {

	private static final long serialVersionUID = 1L;

	private Map<ProjetoAtividade,Boolean> checkMap = new HashMap<ProjetoAtividade,Boolean>();

	private List<ProjetoAtividade> items;
	
	@Inject
	private DespesaBC despesaBC;
	
	@Inject
	private ProjetoAtividadeBC projetoAtividadeBC;
	
	@Override
	@Transactional
	public String delete() {
		this.despesaBC.delete(getId());
		return getPreviousView();
	}
	
	@Override
	@Transactional
	public String insert() {
		getBean().setListaProjetoAtividade(getSelected());
		this.despesaBC.insert(getBean());
		return getPreviousView();
	}
	
	@Override
	@Transactional
	public String update() {
		getBean().setListaProjetoAtividade(getSelected());
		this.despesaBC.update(getBean());
		return getPreviousView();
	}
	
	@Override
	protected Despesa handleLoad(Long id) {
		setBean(this.despesaBC.load(id));
		
		getItems();
		
		if(this.getBean() != null && this.getBean().getListaProjetoAtividade() != null) {
			for (ProjetoAtividade pa : items) {
				for (ProjetoAtividade paCadastrado : this.getBean().getListaProjetoAtividade()) {
					if (pa.equals(paCadastrado)) {
						checkMap.put(pa, new Boolean(true));
					}
				}
				if (checkMap.get(pa) == null ) {
					checkMap.put(pa, new Boolean(false));
				}
			}
		}
		
		return getBean();
	}
	
	public List<ProjetoAtividade> getItems() {
		if (items == null) {
			items = this.projetoAtividadeBC.findAll();
		}
		return items;
	}

	public Map<ProjetoAtividade, Boolean> getCheckMap() {
		return checkMap;
	}
	
	public List<ProjetoAtividade> getSelected() {
		List<ProjetoAtividade> result = new ArrayList<ProjetoAtividade>();
		
	    for (Entry<ProjetoAtividade,Boolean> entry : checkMap.entrySet()) {
	        if (entry.getValue()) {
	            result.add(entry.getKey());
	        }
	    }
	    return result;
//	    return new ArrayList<ProjetoAtividade>();
	}
}